Vorgang im Fertigungsauftrag anlegen

BAPIs sollten eigentlich programmtechnisch das möglich machen, was auch im Dialog möglich ist. Leider gibt es sehr viele Unterschiede zwischen BAPI und entsprechender Dialog-Transaktion.

Im Produktionsumfeld ist es so, dass ein Fertigungsauftrag gar nicht komplett mit Hilfe von BAPIs angelegt werden kann. Die Anlage bzw. Änderung muss in mehrere Schritten erfolgen. Normalerweise reicht es dem BAPI_PRODORD_CREATE unter Angabe einer Materialnummer und eines Werkes um einen Fertigungsauftrag anzulegen.

Aber natürlich gibt es immer Umstände, die eine gezielte Anlage oder Manipulation des Fertigungsauftrags notwendig machen. In diesem Beispiel zeige ich die Anlage eines Vorgangs. Hierfür gibt es leider keinen BAPI und ich verwende den Baustein CO_SE_PRODORD_CHANGE, da dieser problemlos separat aufzurufen war. Es gibt noch den Baustein CO_XT_OPERATION_CHANGE, der jedoch Vorbereitungen mit anderen CO_XT-Bausteinen benötigt.

Code

"Lokale Daten
 DATA lv_aufnr TYPE aufnr.
 DATA ls_return TYPE bapiret2.
 DATA lt_operations TYPE cose_t_operation.
 DATA ls_operation TYPE cose_s_operation.
 DATA ls_header TYPE cose_s_header.

"Vorgangsdaten
 ls_operation-standard_value_01 = data-vgw01.
 ls_operation-standard_value_01_unit = data-vge01.
 ls_operation-standard_value_02 = data-vgw02.
 ls_operation-standard_value_02_unit = data-vge02.
 ls_operation-short_text = data-vorgangstext.

 ls_operation-sequence = space.
 ls_operation-operation = data-vornr.
 ls_operation-work_center = data-arbpl.
 ls_operation-control_key = data-steus. 
 ls_operation-earliest_end_exec_date = data-endtermin.
 ls_operation-earliest_end_exec_time = '210000'.
 ls_operation-base_quantity = data-menge.
 ls_operation-dispatch_indicator = abap_false.
 ls_operation-user_field_02_character = data-xyz.

 ls_operation-standard_value_01_x = abap_true.
 ls_operation-standard_value_01_unit_x = abap_true.
 ls_operation-standard_value_02_x = abap_true.
 ls_operation-standard_value_02_unit_x = abap_true.
 ls_operation-work_center_x = abap_true.
 ls_operation-earliest_end_exec_date_x = abap_true.
 ls_operation-earliest_end_exec_time_x = abap_true.
 ls_operation-short_text_x = abap_true.
 ls_operation-base_quantity_x = abap_true.
 ls_operation-user_field_02_character_x = abap_true.
 APPEND ls_operation TO lt_operations.

 SET UPDATE TASK LOCAL.

"Anlage/ Änderung des Vorgangs
 CALL FUNCTION 'CO_SE_PRODORD_CHANGE'
   EXPORTING
     iv_order_number = lv_aufnr
     is_header = ls_header
     it_operation = lt_operations
     iv_commit = abap_true
   IMPORTING
     es_return = ls_return.
     export_werks_to_memory( space ).

 IF ls_return IS INITIAL.
   COMMIT WORK.
 ELSE.
   RAISE EXCEPTION TYPE zcx_order.
 ENDIF.

Keine Werksänderung möglich

Leider hat der verwendete Baustein eine Einschränkung, die es im Dialog nicht gibt: Es kann kein abweichendes Werk im Vorgang übergeben werden. Dies war jedoch zwingend notwendig. Ich wusste dann keine andere Möglichkeit, als an geeigneter Stelle eine Erweiterungsimplementierung zu erstellen, die das vom Baustein gefundene Default-Werk überschreibt.

Die Erweiterung habe ich im Programm LCO_SEF03 am Ende der FORM-Routine opr_set_default_values gesetzt. Vor Aufruf des Bausteins CO_SE_PROORD_CHANGE exportiere ich das zu verwendende Werk über EXPORT TO MEMORY in den SAP-Speicher. Die Erweiterungsimplementierung überschreibt das Feld gs_afvgd-werks  mittels IMPORT FROM MEMORY (sofern vorhanden). Hiermit ist nur die Anlage oder Änderung eines Vorgangs möglich. Für das Ändern mehrerer Vorgänge muss die Logik entsprechend angepasst werden und man muss in der Erweiterung prüfen, welcher Vorgang gerade bearbeitet wird.

Enno Wulff